#include "serial_driver.h"
#include <QDebug>

SerialDriver::SerialDriver()
{
    m_serial = new QSerialPort();
    data.resize(32);
}

SerialDriver::~SerialDriver()
{
    close();
}

bool SerialDriver::open(QString serialName, int baudRate)
{
    // 设置串口名
    m_serial->setPortName(serialName);
    // 打开串口(以读写方式)
    if(m_serial->open(QIODevice::ReadWrite))
    {
        m_serial->setBaudRate(baudRate); // 设置波特率(默认为9600)
        m_serial->setDataBits( QSerialPort::Data8 ); // 设置数据位(数据位为8位)
        m_serial->setParity( QSerialPort::NoParity ); // 设置校验位(无校验位)
        m_serial->setStopBits( QSerialPort::OneStop ); // 设置停止位(停止位为1)
        m_serial->setFlowControl( QSerialPort::NoFlowControl ); // 设置流控制(无数据流控制)

        // 当下位机中有数据发送过来时就会响应这个槽函数
        //QIODevice::connect(m_serial, &QSerialPort::readyRead, this, &SerialDriver::readData);
        // 当下位机中有数据发送过来时就会触发这个信号，以提示其它类对象
        //connect(m_serial, SIGNAL(readyRead()), this, SIGNAL(readSignal()));

        return true;
    }

    return false;
}

QStringList SerialDriver::scanSerial()
{
    QStringList serialStrList;

    // 读取串口信息
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        m_serial->setPort(info);
        // 判断端口能否以读写方式打开
        if(m_serial->open(QIODevice::ReadWrite))
        {
            serialStrList.append(m_serial->portName());
            m_serial->close(); // 然后自动关闭等待人为开启（通过"打开串口按钮"）
        }
    }

    return serialStrList;
}


void SerialDriver::readData()
{
    data = m_serial->readAll();
}

void SerialDriver::writeData(const QByteArray &data)
{
    m_serial->write(data);
}

void SerialDriver::close()
{
    if (m_serial->isOpen())
        m_serial->close();
}

void SerialDriver::Debug()
{
    // 读取串口信息
    foreach(const QSerialPortInfo& info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "description :"<<endl;
        qDebug() << info.description()<<endl;
        qDebug() << "manufacturer:"<<endl;
        qDebug() << info.manufacturer()<<endl;
        qDebug() << "portName :"<<endl;
        qDebug() << info.portName()<<endl;
        qDebug() << "serialNumber :"<<endl;
        qDebug() << info.serialNumber()<<endl;
        qDebug() << "systemLocation :"<<endl;
        qDebug() << info.systemLocation()<<endl;
        qDebug() << endl;
    }
}
